/********************************************************************************
 *模拟考场抽取试题设置
 ********************************************************************************/
var G_DistillTest;
/********************************************************************************
 函数名：DistillTest
 功能：模拟考场抽取试题设置
 输入参数: 无
 返回值: 无
 *******************************************************************************/
function DistillTestData(){
	var _arrSrcID=[];	//来源id数组
    var _arrSbjID=[];	//科目id数组
    var _arrCptID=[];	//章节id数组
	var _arrShowName=[];	//显示的科目列表
    var _arrShowIndex=[];	//备选科目在来源、科目、章节id数组中的索引（去重操作所用），二维数组
	
	//_init();
	
	function _init(){
		_setShowSubject();
	}
	/********************************************************************************
	函数名：getDefaultConfig
	功能： 获取配置数据
	输入参数：无
	返回值：无
	*******************************************************************************/
	this.getDefaultConfig = function(appID){
		var jsonData = ''; 	//试题json数据
		G_AjaxApi_Record.get('/api/simulationTest/defaultSimulationManageApi/'+ appID,false,function (json) {
				var jsonObj = JSON.parse(json);
				if (jsonObj.status === 200) {	//200 获取数据成功
					//字符串转json对象
					jsonData = jsonObj.data;
				}else if (jsonObj.status === 201) {	
					jsonData = '';
				}else if(jsonData.status === 300){
					// G_maiDian.setBugRecordInfos('程序错误','模拟考场——获取默认配置',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，DistillTestData.getDefaultConfig,数据库获取数据异常'); 
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					// G_maiDian.setBugRecordInfos('业务逻辑错误','模拟考场——获取默认配置',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，DistillTestData.getDefaultConfig,数据库获取数据异常'); 
				} else{
					// G_maiDian.setBugRecordInfos('其它程序错误','模拟考场——获取默认配置',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，不能处理，DistillTestData.getDefaultConfig : status = "'+jsonObj.status+'"！');
				}
			});
		return jsonData;	
	}
	/********************************************************************************
	函数名：_getSubjectJsonData
	功能： 获取json数据（包含来源、科目、章节）
	输入参数：appEName 软件英文名称
	返回值：无
	*******************************************************************************/
	function _getSubjectJsonData(appEName) {
		var chapterData = '';
		G_AjaxApi_Record.get('/api/chapterMenu/getChapterMenu/' + appEName, false, function (json) {//
			var jsonData = JSON.parse(json);
			 if (jsonData.status === 200) {//获得有数据成功
				chapterData = jsonData.data.ChapterMenuJson;
			}else if(jsonData.status === 300){
				// G_maiDian.setBugRecordInfos('程序错误','模拟考场——获取配置范围json数据',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData._getSubjectJsonData,数据库获取数据异常'); 
			} else if(jsonData.status >= 400 && jsonData.status < 500){
				// G_maiDian.setBugRecordInfos('业务逻辑错误','模拟考场——获取配置范围json数据',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData._getSubjectJsonData,数据库获取数据异常'); 
			} else{
				// G_maiDian.setBugRecordInfos('其它程序错误','模拟考场——获取配置范围json数据',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，不能处理，DistillTestData._getSubjectJsonData : status = "'+jsonObj.status+'"！');
			}
		});
		return chapterData;
	}
	/********************************************************************************
	函数名：getChapterMenuData
	功能：获取章节目录（若本地保存有章节最新数据，则从本地取数据，否则从接口取数据，然后将数据存在本地）
	输入参数: appEName 软件英文名
	返回值：updateTime 章节目录更新时间
	********************************************************************************/
	function _getChapterMenuData(){
		var appEName=G_Cookie.getAppEName();
		if(!appEName){
			G_Prg.throw('程序运行错误，DistillTestData._getChapterMenuData: appEName = "' + appEName + '",获取数据出现异常！');
		}
		var chapterData='';
		if(G_Storage.checkLocalStorageSupport()){
			var chapterMenu = G_Storage.getLocalStorageValue('chapterMenuData');
			var updateTime = _getChapterMenuUpdateTime(appEName);
			if(chapterMenu && appEName === chapterMenu.AppEName && updateTime === chapterMenu.UpdateTime){
				chapterData=chapterMenu.Data;
				return chapterData;
			}
		}
		var chapterData = _getSubjectJsonData(appEName);
		var chapterMenuJson={
			"Data":chapterData.ChapterMenuJson,
			"AppEName":appEName,
			"UpdateTime":chapterData.ChapterMenuUpdateTime
		};
		if(G_Storage.checkLocalStorageSupport()){
			G_Storage.setLocalStorageValue('chapterMenuData',chapterMenuJson);
		}
		return chapterData;
	}
	
	/********************************************************************************
	函数名：_getChapterMenuUpdateTime
	功能：获取章节目录更新时间
	输入参数: appEName 软件英文名
	返回值：updateTime 章节目录更新时间
	********************************************************************************/
	function _getChapterMenuUpdateTime(appEName){
		var updateTime='';
		G_AjaxApi_Record.get('/api/chapterMenu/getChapterMenuUpdateTime/'+appEName,false,function(json){
			var jsonData = JSON.parse(json);
			if (jsonData.status === 200) {//获得有数据成功
				updateTime = jsonData.data.ChapterMenuUpdateTime;
			} else if(jsonData.status === 300){
				// G_maiDian.setBugRecordInfos('程序错误','模拟考场——获取章节目录更新时间',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData._getChapterMenuUpdateTime,数据库获取数据异常'); 
			} else if(jsonData.status >= 400 && jsonData.status < 500){
				// G_maiDian.setBugRecordInfos('业务逻辑错误','模拟考场——获取章节目录更新时间',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData._getChapterMenuUpdateTime,数据库获取数据异常'); 
			} else{
				// G_maiDian.setBugRecordInfos('其它程序错误','模拟考场——获取章节目录更新时间',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，不能处理，DistillTestData._getChapterMenuUpdateTime : status = "'+jsonObj.status+'"！');
			}
		});
		return updateTime;
	}
	/********************************************************************************
	函数名：_setShowSubject
	功能： 设置要选择的科目数据
	输入参数：无
	返回值：无
	*******************************************************************************/
	function _setShowSubject(){
		var chapterJson = _getChapterMenuData();
		var chapterData = JSON.parse(chapterJson).Childs;
		var arrName = [];
		var index = 0;
		for(var i=0;i<chapterData.length;i++){
			var srcData=chapterData[i].Childs;
			var srcID=chapterData[i].ID;
			for(var j=0;j<srcData.length;j++){
				var sbjData=srcData[j].Childs;
				var sbjID=srcData[j].ID;
				var sbjName=srcData[j].Name;
                var newArrSub=[];
                var start=_removeRepeatName(sbjName);
				if(start){
                    _arrShowIndex[start-1].push(index);//减1是因为_removeRepeatName的返回值是数组下标+1
				}else{
					newArrSub.push(index);
					_arrShowName.push(sbjName);
					_arrShowIndex.push(newArrSub);
				}
				_arrSrcID.push(srcID);
				_arrSbjID.push(sbjID);
				var cptID=[];
				for(var k=0;k<sbjData.length;k++){
					cptID.push(sbjData[k].ID);
				}
				_arrCptID.push(cptID);
				index++;
			}
		}
	}
	/********************************************************************************
	函数名：_removeRepeatName
	功能： 对展示的科目进行去掉重复处理
	输入参数：subName 科目名称
	返回值：i+1 如果与当前要展示的科目_arrShowName有重复，则返回重复元素的数组下标+1（加1是为了区分是否有返回值。如果无重复，则无返回，如果数组下标为零，如果返回值不加1，则无法判断）
	*******************************************************************************/
	function _removeRepeatName (subName){
		for(var i=0;i<_arrShowName.length;i++){
		   if(_arrShowName[i] === subName){
			  return(i+1);
		   }
		}
	}
	
//	/* 获取详细的科目信息 */
//	this.detailSubject = function(){
//		var chapterJson = _getChapterMenuData();
//		var chapterData = JSON.parse(chapterJson).Childs;
//		console.log(chapterData);
//	}
	/********************************************************************************
	函数名：getTestStyleData
	功能： 获取选中的科目下所有试题的试题类型
	输入参数：appEName 软件英文名称,arrCptID 章节id数组,userID 用户id,guid 验证信息码
	返回值：无
	*******************************************************************************/
	this.getTestStyleData = function(appEName,arrCptID,userID,guid) {
		var params = {
			appEName : appEName,
    		arrCptID :arrCptID,
    		userID : userID,
     		guid : guid
			};
		var testStyleData = '';
		G_AjaxApi_Record.post('/api/exam/getSimulationTestStyle',params, false, function (json) {
			var jsonData = JSON.parse(json);
			if (jsonData.status === 200) {//获得有数据成功
				testStyleData = jsonData.data;
			} else if(jsonData.status === 300){
				// G_maiDian.setBugRecordInfos('程序错误','模拟考场——获取题型',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData.getTestStyleData,数据库获取数据异常'); 
			} else if(jsonData.status >= 400 && jsonData.status < 500){
				// G_maiDian.setBugRecordInfos('业务逻辑错误','模拟考场——获取题型',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData.getTestStyleData,数据库获取数据异常'); 
			} else{
				// G_maiDian.setBugRecordInfos('其它程序错误','模拟考场——获取题型',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，不能处理，DistillTestData.getTestStyleData : status = "'+jsonObj.status+'"！');
			}
		});
		return testStyleData;
	}
	/********************************************************************************
	函数名：getConfigJsonData
	功能： 获取配置数据
	输入参数：无
	返回值：无
	*******************************************************************************/
	this.getConfigJsonData = function(){
		var userID = G_Cookie.getUserID();
		if (!userID) {
 			G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData : userID = "'+userID+'",获取数据出现异常'); 
 		}
		var appEName = G_Cookie.getAppEName();
		if(!appEName){
			G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData : appEName = '+appEName+'",获取数据出现异常');
		}
		var appID = G_Cookie.getAppID();
 		if (!appID) {
 			G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData : appID = "'+appID+'",获取数据出现异常'); 
 		}
		var guid = G_Cookie.getGuid();	//检验码
		var jsonData = ''; 	//试题json数据
		G_AjaxApi_Record.get('/api/exam/getSimulationExamJson/'+ appEName +'/'+ userID + '/'+appID+'/'+ guid,false,function (json) {
				var jsonObj = JSON.parse(json);
				if (jsonObj.status === 200) {	//200 获取数据成功
					//字符串转json对象
					//jsonData = jsonObj.data;
					//jsonData = jsonObj.data.arrConfigs[0];
					jsonData = jsonObj.data.arrConfigs;
				}else if (jsonObj.status === 201) {	
					jsonData = '';
				}else if (jsonObj.status === 202) {	
//					G_Prg.throw('该功能购买后才能使用！', function () {
//						window.location.href = 'default.html';
//					}); 
				}else if(jsonData.status === 300){
					// G_maiDian.setBugRecordInfos('程序错误','模拟考场——获取用户的模拟考场配置',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData,数据库获取数据异常'); 
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					// G_maiDian.setBugRecordInfos('业务逻辑错误','模拟考场——获取用户的模拟考场配置',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData,数据库获取数据异常'); 
				} else{
					// G_maiDian.setBugRecordInfos('其它程序错误','模拟考场——获取用户的模拟考场配置',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，不能处理，DistillTestData.getConfigJsonData : status = "'+jsonObj.status+'"！');
				}
			});
		return jsonData;	
	}
	/********************************************************************************
	函数名：_setConfigJson
	功能： 拼接保存配置的json
	输入参数：无
	返回值：无
	创建信息：黎萍（2014-09-26）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.setConfigJson = function(appID,userID,jsonObj,configName,guid){
		var simulationExamRuleID = '';
		var params = {
			appID : appID,
    		userID : userID,
    		simulationExamJson :jsonObj,
			configTitle : configName,
     		guid : guid
			};
        G_AjaxApi_Record.post('/api/exam/setSimulationTestConfig',params,false,function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {
				//G_Prg.alert('保存成功');
                simulationExamRuleID = jsonObj.data.simulationExamRuleID;
            }else if(jsonData.status === 300){
				// G_maiDian.setBugRecordInfos('程序错误','模拟考场——保存用户的模拟考场配置',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData,数据库获取数据异常', function () {
                    location.reload(true);
                }); 
			} else if(jsonData.status >= 400 && jsonData.status < 500){
				// G_maiDian.setBugRecordInfos('业务逻辑错误','模拟考场——保存用户的模拟考场配置',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，DistillTestData.getConfigJsonData,，输入参数有误！', function () {
                    location.reload(true);
                }); 
			} else{
				// G_maiDian.setBugRecordInfos('其它程序错误','模拟考场——保存用户的模拟考场配置',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，不能处理，DistillTestData.getConfigJsonData : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
			}
        });
		return simulationExamRuleID;
    }
	/********************************************************************************
	函数名：getArrSrcID
	功能：获取科目来源ID数组
	输入参数：科目来源ID数组
	返回值：无
	创建信息：黎萍（2014-09-29）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getArrSrcID = function () {
        if(!_arrSrcID.length){
            _setShowSubject();
        }
		return _arrSrcID;
	};
	/********************************************************************************
	函数名：getArrSbjID
	功能：获取科目ID数组
	输入参数：科目ID数组
	返回值：无
	创建信息：黎萍（2014-09-29）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getArrSbjID = function () {
        if(!_arrSbjID.length){
            _setShowSubject();
        }
		return _arrSbjID;
	};
	/********************************************************************************
	函数名：getArrCptID
	功能：获取科目章节ID数组
	输入参数：科目章节ID数组
	返回值：无
	创建信息：黎萍（2014-09-29）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getArrCptID = function () {
        if(!_arrCptID.length){
            _setShowSubject();
        }
		return _arrCptID;
	};
	/********************************************************************************
	函数名：getArrShowName
	功能：获取显示的科目列表
	输入参数：显示的科目列表数组
	返回值：无
	创建信息：黎萍（2014-09-29）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getArrShowName = function () {
        if(!_arrShowName.length){
            _setShowSubject();
        }
		return _arrShowName;
	};
	/********************************************************************************
	函数名：getArrShowIndex
	功能：备选科目在来源、科目、章节id数组中的索引（去重操作所用）
	输入参数：显示id数组
	返回值：无
	创建信息：黎萍（2014-09-29）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getArrShowIndex = function () {
        if(!_arrShowIndex.length){
            _setShowSubject();
        }
		return _arrShowIndex;
	};
}